package component

import (
	"context"
	"io"
	"net/http"
	"net/url"
)

// WebContext Web请求上下文
type WebContext interface {
	// Context 返回请求上下文
	Context() context.Context
	// SetContext 设置请求上下文，如skywalking组件对已有的context进行包装，通过此方法设置新的context
	SetContext(ctx context.Context) context.Context
	// RequestId 返回请求ID
	RequestId() string
	// URI 返回请求的URI
	URI() string
	// URL 返回当前请求的URL对象
	URL() *url.URL
	// Method 返回当前请求的Method；
	Method() string
	// Host 返回当前请求的Host
	Host() string
	// RemoteAddr 返回当前请求的客户端地址
	RemoteAddr() string
	// Headers 返回请求对象的Header；只读；
	Headers() http.Header
	// QueryParams 返回Query查询参数键值对；只读；
	QueryParams() url.Values
	// PathValues 返回动态路径参数的键值对；只读；
	PathValues() url.Values
	// FormValues 返回Form表单参数键值对；只读；包含Query参数域的键值对
	FormValues() url.Values
	// PostFormValues 返回PostForm表单参数键值对；只读；
	PostFormValues() url.Values
	// Cookies 返回Cookie列表；只读；
	Cookies() []*http.Cookie
	// Header 读取请求的Header参数值
	Header(name string) string
	// QueryParam 查询指定Name的Query参数值
	QueryParam(name string) string
	// PathValue 查询指定Name的动态路径参数值
	PathValue(name string) string
	// FormValue 查询指定Name的表单参数值；FormVars包含Query参数域的键值对
	FormValue(name string) string
	// PostFormValue 查询指定Name的Post表单参数值
	PostFormValue(name string) string
	// Cookie 查询指定Name的Cookie对象，并返回是否存在标识
	Cookie(name string) (*http.Cookie, error)
	// Body 请求体
	Body() (io.ReadCloser, error)
	// SetVariable 设置Context域键值；作用域与请求生命周期相同；
	SetVariable(key string, value interface{})
	// Variable 获取WebValue域键值；作用域与请求生命周期相同；
	Variable(key string) (interface{}, bool)
	// Request 返回标准HttpRequest对象
	Request() *http.Request
	// ResponseWriter 返回HttpWeb服务器的ResponseWriter对象。
	ResponseWriter() http.ResponseWriter
	// Write 直接写入并返回响应状态码和响应数据到客户端
	Write(statusCode int, contentType string, data []byte) error
	// WriteStream 直接写入并返回响应状态码和流数据到客户端
	WriteStream(statusCode int, contentType string, reader io.Reader) error
	// WriteJSON 直接写入并返回响应状态码和JSON数据到客户端
	WriteJSON(statusCode int, data interface{}) error
}
